SQL UPDATE statement
Home

SQL UPDATE statement

SQL UPDATE statement

Naast het inserten en selecteren van rijen moeten we ook rijen kunnen updaten.

Probleem

Het UPDATE DML statement gelijkt op het ALTER DDL statement. Beiden brengen één of meerdere wijzigingen aan in de database. Daar waar ALTER de structuur van een tabel wijzigt, wijzigt UPDATE de gegevens die in een tabel zitten.

Oplossing

We hebben daarnet de kolom Categorie toegevoegd. Maar de kolom categorie is voor de eerste tien boeken nog niet ingevuld. We kunnen het UPDATE statement gebruiken om de categorieën voor de eerste tien boeken in te vullen.

In zijn meest eenvoudige vorm ziet het UPDATE statement er zo uit:

-- ji
-- 27 november 2012
--
use A88586JefInghelbrecht;
update Boeken set Categorie = 'Metafysica';
select * from Boeken;

Als je meer dan een kolom wil updaten:

-- ji
-- 11 september 2013
-- Bestandsnaam: BoekenUpdateAllRows.sql
use JefInghelbrecht;
update Boeken set Categorie = 'Wetenschap',
   Titel = 'Mijn eerste boek';
select Titel, Categorie from Boeken;

Zonder verdere specificatie zet dat statement de kolom Categorie van alle rijen op Metafysica.

Het zou kunnen dat alle boeken in de categorie Metafysica thuishoren. En in dat geval doet het UPDATE statement precies wat je er van verwacht. De boeken in ons voorbeeld behoren tot verschillende categorieën. We moeten dus in het UPDATE statement specifiëren in welke rij we de kolom Categorie willen updaten. We moeten één bepaalde rij eruit filteren. Dat doen we met de WHERE clausule. We beperken de update tot de boeken waarvan de titel gelijk is aan 'Logicaboek'.

-- ji
-- 27 november 2012
--
use A88586JefInghelbrecht;
update Boeken
   set Categorie = 'Wiskundige logica. Mathematische logica'
   where Titel = 'Logicaboek';

De WHERE clausule bepaalt een voorwaarde, een logische expressie die door de database als waar of vals geëvalueerd wordt. De voorwaarde Id = 1 wordt voor elke rij in de tabel geëvalueerd. Als de evaluatie van de logische expressie voor een bepaalde rij waar oplevert wordt die rij geüpdated. Nog een voorbeeld:

update Boeken
   set Categorie = 'Logica. Epistemologie, kennistheorie.
   Methodiek der logica, kennisleer'
   where Familienaam = 'Beth';

Opgelet!

De vergelijking is in SQL standaard niet hoofdlettergevoelig (meer info).

De volgende query, waarin beth met een kleine letter wordt geschreven, levert hetzelfde resultaat op als de vorige:

update Boeken
   set Categorie = 'Logica. Epistemologie, kennistheorie.
   Methodiek der logica, kennisleer'
   where Familienaam = 'beth';

Sarah vraagt hoe maak je de where van een query hoofdlettergevoelig.

Dat doe je door de collation eigenschap van de kolom tijdelijk te wijzigen:

select Voornaam, Familienaam, Titel
   from Boeken
   where Titel COLLATE Latin1_General_CI_AS = 'logicaboek';

CS betekent Case Sensitive

AS betekent Accent Sensitive

De voorgaande query zal 1 boek retourneren. Als we de titel in kleine letters schrijven zal er geen boek geretourneerd worden.

select Voornaam, Familienaam, Titel
   from Boeken
   where Titel COLLATE Latin1_General_CS_AS = 'logicaboek';

Als je geen rekening wilt houden met accenten vervang je AS door AI (Accent Insensitiv).

Je kan ook meerdere rijen in één keer updaten. Dat doe je door bijvoorbeeld de logische operator OR te gebruiken:

update Boeken
   set Categorie = 'Geschiedenis'
   where Familienaam = 'Braudel' or
      Familienaam = 'Bernard' or
      Familienaam = 'Bloch';

Verder in het handboek leer je meer over logische operatoren. Meerdere kolommen tegelijk kunnen ook gewijzigd worden.

Oefening
-- ji
-- 27 november 2012
-- Bestandsnaam: BoekenUpdateWhere.sql
-- Opgelet! De vergelijking is niet hoofdlettergevoelig
use A88586JefInghelbrecht;

update Boeken
   set Voornaam = 'Geert',
   Familienaam = 'Hoste',
   Uitgeverij = 'De Bezige Olifant'
where Titel = 'De stad van God';

select * from Boeken;

Werken met functies

Algemene informatie over MSSQL functies waaronder ook string-functies: What are the SQL database functions?

concat

In SQL kan je geen strings 'optellen' om strings samen te stellen. Daarvoor gebruik je de concat methode.

Voorbeeld 1

-- TDC
-- 10 September 2014
--
update Boeken set Categorie = 'Wiskunde'
   where Categorie = 'Geschiedenis';
-- Van alle 'Wiskunde' maak je 'Geschiedenis' als er Geschiedenis in een kolom hebt staan.
update Boeken set Categorie = concat('[1]', Categorie)
   where Categorie = 'Wiskunde';

Voorbeeld 2

use ModernWays;
-- update Boeken
--    set Categorie = 'Theologie'
--    where Voornaam = 'Aurelius';
update Boeken
    set Categorie = concat('(1) ', Categorie);
select Categorie from Boeken;

substring

Ik krijg de vraag om '(1)' terug weg te nemen. Hiervoor is substring een goede kandidaag.

-- Hier heb je '[1]' gezet voor de tekst als er 'Wiskunde' staat.
update Boeken set Categorie = substring(Categorie, 4, len(Categorie) -3)
   where left(Categorie, 3) = '[1]';

-- Hier knip je de '[1]' er af door vanaf de 4de char te beginnen ''substring(Categorie, 4''
-- en dan de lengte daarvoor - 3 te doen ''len(Categorie) -3''
-- als er een '[1]' in de categorie staat left voor tot en met de 3de karakter.
select * from Boeken;

JI
2020-01-19 11:30:42